home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Windows Game Programming for Dummies (2nd Edition)
/
WinGamProgFD.iso
/
mac
/
DirectX SDK
/
DXSDK
/
samples
/
Multimedia
/
DirectShow_WinXP
/
VMR
/
TxtPlayer
/
alloclib.cpp
next >
Wrap
C/C++ Source or Header
|
2001-10-08
|
8KB
|
286 lines
//------------------------------------------------------------------------------
// File: alloclib.cpp
//
// Desc: DirectShow sample code
//
// Copyright (c) 2000-2001 Microsoft Corporation. All rights reserved.
//------------------------------------------------------------------------------
#include <streams.h>
#include <malloc.h>
#include "AllocLib.h"
/*****************************Private*Routine******************************\
* YV12PaintSurfaceBlack
*
\**************************************************************************/
HRESULT
YV12PaintSurfaceBlack(
LPDIRECTDRAWSURFACE7 pDDrawSurface
)
{
AMTRACE((TEXT("YV12PaintSurfaceBlack")));
HRESULT hr = NOERROR;
DDSURFACEDESC2 ddsd;
// now lock the surface so we can start filling the surface with black
ddsd.dwSize = sizeof(ddsd);
for ( ;; ) {
hr = pDDrawSurface->Lock(NULL, &ddsd,
DDLOCK_NOSYSLOCK | DDLOCK_WAIT, NULL);
if (hr == DD_OK || hr != DDERR_WASSTILLDRAWING) {
break;
}
Sleep(1);
}
if (hr == DD_OK)
{
DWORD y;
LPBYTE pDst = (LPBYTE)ddsd.lpSurface;
LONG OutStride = ddsd.lPitch;
DWORD VSize = ddsd.dwHeight;
DWORD HSize = ddsd.dwWidth;
// Y Component
for (y = 0; y < VSize; y++) {
FillMemory(pDst, HSize, (BYTE)0x10); // 1 line at a time
pDst += OutStride;
}
HSize /= 2;
VSize /= 2;
OutStride /= 2;
// Cb Component
for (y = 0; y < VSize; y++) {
FillMemory(pDst, HSize, (BYTE)0x80); // 1 line at a time
pDst += OutStride;
}
// Cr Component
for (y = 0; y < VSize; y++) {
FillMemory(pDst, HSize, (BYTE)0x80); // 1 line at a time
pDst += OutStride;
}
pDDrawSurface->Unlock(NULL);
}
return hr;
}
/******************************Public*Routine******************************\
* YUV16PaintSurfaceBlack
*
\**************************************************************************/
HRESULT
YUV16PaintSurfaceBlack(
LPDIRECTDRAWSURFACE7 pdds,
DWORD dwBlack
)
{
AMTRACE((TEXT("YUV16PaintSurfaceBlack")));
HRESULT hr = NOERROR;
DDSURFACEDESC2 ddsd;
// now lock the surface so we can start filling the surface with black
ddsd.dwSize = sizeof(ddsd);
for ( ;; ) {
hr = pdds->Lock(NULL, &ddsd, DDLOCK_NOSYSLOCK | DDLOCK_WAIT, NULL);
if (hr == DD_OK || hr != DDERR_WASSTILLDRAWING) {
break;
}
Sleep(1);
}
if (hr == DD_OK)
{
DWORD y, x;
LPDWORD pDst = (LPDWORD)ddsd.lpSurface;
LONG OutStride = ddsd.lPitch;
for (y = 0; y < ddsd.dwHeight; y++) {
for (x = 0; x < ddsd.dwWidth / 2; x++) {
pDst[x] = dwBlack;
}
// Dont forget that the stride is a byte count
*((LPBYTE*)&pDst) += OutStride;
}
pdds->Unlock(NULL);
}
return hr;
}
/*****************************Private*Routine******************************\
* BlackPaintProc
*
\**************************************************************************/
HRESULT
BlackPaintProc(
LPDIRECTDRAWSURFACE7 pDDrawSurface,
DDSURFACEDESC2* lpddSurfaceDesc
)
{
AMTRACE((TEXT("BlackPaintProc")));
//
// If the surface is YUV take care of the types that we
// know the pixel format for. Those surfaces that we don't know
// about will get painted '0' which may be bright green for
// YUV surfaces.
//
if (lpddSurfaceDesc->ddpfPixelFormat.dwFlags & DDPF_FOURCC) {
//
// compute the black value if the fourCC code is suitable,
// otherwise can't handle it
//
switch (lpddSurfaceDesc->ddpfPixelFormat.dwFourCC) {
case mmioFOURCC('Y','V','1','2'):
case mmioFOURCC('I','4','2','0'):
case mmioFOURCC('I','Y','U','V'):
return YV12PaintSurfaceBlack(pDDrawSurface);
case mmioFOURCC('Y','U','Y','2'):
return YUV16PaintSurfaceBlack(pDDrawSurface, 0x80108010);
case mmioFOURCC('U','Y','V','Y'):
return YUV16PaintSurfaceBlack(pDDrawSurface, 0x10801080);
}
}
DDBLTFX ddFX;
INITDDSTRUCT(ddFX);
return pDDrawSurface->Blt(NULL, NULL, NULL, DDBLT_COLORFILL, &ddFX);
}
/*****************************Private*Routine******************************\
* PaintSurfaceBlack
*
\**************************************************************************/
HRESULT
PaintDDrawSurfaceBlack(
LPDIRECTDRAWSURFACE7 pDDrawSurface
)
{
AMTRACE((TEXT("PaintDDrawSurfaceBlack")));
LPDIRECTDRAWSURFACE7 *ppDDrawSurface = NULL;
DDSCAPS2 ddSurfaceCaps;
DDSURFACEDESC2 ddSurfaceDesc;
DWORD dwAllocSize;
DWORD i = 0, dwBackBufferCount = 0;
// get the surface description
INITDDSTRUCT(ddSurfaceDesc);
HRESULT hr = pDDrawSurface->GetSurfaceDesc(&ddSurfaceDesc);
if (SUCCEEDED(hr)) {
if (ddSurfaceDesc.dwFlags & DDSD_BACKBUFFERCOUNT) {
dwBackBufferCount = ddSurfaceDesc.dwBackBufferCount;
}
hr = BlackPaintProc(pDDrawSurface, &ddSurfaceDesc);
if (FAILED(hr))
{
DbgLog((LOG_ERROR,1,
TEXT("pDDrawSurface->Blt failed, hr = 0x%x"), hr));
return hr;
}
if (dwBackBufferCount > 0) {
dwAllocSize = (dwBackBufferCount + 1) * sizeof(LPDIRECTDRAWSURFACE);
ppDDrawSurface = (LPDIRECTDRAWSURFACE7*)_alloca(dwAllocSize);
ZeroMemory(ppDDrawSurface, dwAllocSize);
ZeroMemory(&ddSurfaceCaps, sizeof(ddSurfaceCaps));
ddSurfaceCaps.dwCaps = DDSCAPS_FLIP | DDSCAPS_COMPLEX;
if( DDSCAPS_OVERLAY & ddSurfaceDesc.ddsCaps.dwCaps ) {
ddSurfaceCaps.dwCaps |= DDSCAPS_OVERLAY;
}
for (i = 0; i < dwBackBufferCount; i++) {
LPDIRECTDRAWSURFACE7 pCurrentDDrawSurface = NULL;
if (i == 0) {
pCurrentDDrawSurface = pDDrawSurface;
}
else {
pCurrentDDrawSurface = ppDDrawSurface[i];
}
ASSERT(pCurrentDDrawSurface);
//
// Get the back buffer surface and store it in the
// next (in the circular sense) entry
//
hr = pCurrentDDrawSurface->GetAttachedSurface(
&ddSurfaceCaps,
&ppDDrawSurface[i + 1]);
if (FAILED(hr))
{
DbgLog((LOG_ERROR,1,
TEXT("Function pDDrawSurface->GetAttachedSurface ")
TEXT("failed, hr = 0x%x"), hr ));
break;
}
ASSERT(ppDDrawSurface[i+1]);
//
// Peform a DirectDraw colorfill BLT
//
hr = BlackPaintProc(ppDDrawSurface[i + 1], &ddSurfaceDesc);
if (FAILED(hr)) {
DbgLog((LOG_ERROR,1,
TEXT("ppDDrawSurface[i + 1]->Blt failed, ")
TEXT("hr = 0x%x"), hr));
break;
}
}
}
}
if (ppDDrawSurface) {
for (i = 0; i < dwBackBufferCount + 1; i++) {
if (ppDDrawSurface[i]) {
ppDDrawSurface[i]->Release();
}
}
}
if (hr != DD_OK) {
DbgLog((LOG_ERROR, 1, TEXT("PaintSurfaceBlack failed")));
hr = S_OK;
}
return hr;
}